#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <iostream>
#include <vector>
#include <random>
#include <string>
#include <fstream>
#include "menu.h"
#include "meteor.h"
#include "bullet.h"
#include "music.h"
#include "rocket.h"


int main() {
	repeat: //стартуем после перезапуска
	bool checkGame = true;
	bool showMenu = true;

	system("chcp 1251>nul");
	setlocale(LC_ALL, "RUS");

	sf::RenderWindow window(sf::VideoMode(1920, 1080), "Blaster", sf::Style::Fullscreen);
	sf::Image icon;//подрубаем иконку
	if (!icon.loadFromFile("Image/icon.png")) {
		return 1;
	}


	//открываем файл с рекордом и считываем из него число
	std::ifstream inputFile("record.txt");
	if (!inputFile.is_open()) {
		return 2; //не удалось открыть файл
	}
	int record;
	inputFile >> record; // Чтение числа из файла
	if (inputFile.fail()) {
		std::cout << "Ne ydalos chitat record" << std::endl;
		return 3;
	}
	inputFile.close();

	window.setIcon(32, 32, icon.getPixelsPtr());

	menu(window);

	//Текстура фона
	sf::Texture spaceTextures;
	spaceTextures.loadFromFile("Image/space1.png");

	//создаем обьект фон
	sf::Sprite spaceSprite1, spaceSprite2;
	spaceSprite1.setTexture(spaceTextures);
	spaceSprite2.setTexture(spaceTextures);
	spaceSprite2.setPosition(3840, 0);

	sf::Texture hpTextures;
	sf::Sprite hpSprite1, hpSprite2, hpSprite3;
	hpTextures.loadFromFile("Image/HP.png");
	hpSprite1.setTexture(hpTextures); hpSprite2.setTexture(hpTextures); hpSprite3.setTexture(hpTextures);
	hpSprite1.setTextureRect(sf::IntRect(20, 0, 20, 18)); hpSprite2.setTextureRect(sf::IntRect(20, 0, 20, 18)); hpSprite3.setTextureRect(sf::IntRect(20, 0, 20, 18));
	hpSprite1.scale(sf::Vector2f(3, 3)); hpSprite2.scale(sf::Vector2f(3, 3)); hpSprite3.scale(sf::Vector2f(3, 3));
	hpSprite1.setPosition(1800, 10); hpSprite2.setPosition(1735, 10); hpSprite3.setPosition(1670, 10);

	Rocket rocket;

	std::vector<Meteor> meteors;
	std::vector <Bullet> bullets;
	std::vector <Musics> musics;

	float x = 1920;
	sf::Vector2f pos;
	sf::Clock clock, clock1; //тип времени

	std::default_random_engine engine; //рандомные числа
	std::uniform_real_distribution <float> speedDist(2, 6);//диапозон от 1 до 5
	std::uniform_real_distribution <float> yDist(50, 1000);//от100 до 950

	float speedi = 0; //скорость комет которая увеличивается со временем
	float bulletInterval = 1.2;//время в секудах через которое можно будет запустить пулку

	int hp = 3; //3 хп ракеты

	for (int i = 0; i < 20; i++) {
		float speed = speedDist(engine);// рандомные числа то есть скорости в диапозоне от 1 до 5
		float y = yDist(engine);// рандомные числа то есть ось У в диапозоне от 100 до 950
		meteors.emplace_back(25.f, speed, rand() % 3, rand() % 4 + 4, sf::Vector2f(x, y));//добавляем в массив нашу комету
		x += 200;
	}




	for (int i = 0; i < 5; i++) {

		musics.emplace_back(i);

	}

	musics[4].sound.play();
	int sp = 0; //счет пока жив
	int gg = 0;//счет сбитых комет

	while (window.isOpen()) {

		checkGame = true;
		sp++;
		srand(time(0));
		speedi -= 0.0002;//скорость комет на сколько она будет увеличиваться зависит от пк
		float time = clock.getElapsedTime().asMicroseconds();//милисекунды
		float time1 = clock1.getElapsedTime().asSeconds();//секунды
		clock.restart();//перезапуск времени
		time = time / 300;

		//отображение очков
		sf::Font font;
		font.loadFromFile("vcrosdmonorusbyd.ttf"); //подрубаем шрифт
		sf::Text text("", font, 80); // создаём объект текст
		text.setFillColor(sf::Color::Yellow);
		text.setStyle(sf::Text::Bold);

		std::string str_coin = std::to_string(sp + gg); //переводим число в строку
		text.setString(str_coin);
		text.setPosition(0, 0); //счёт место вывода



		if (hp == 2)
		{
			hpSprite3.setTextureRect(sf::IntRect(0, 0, 20, 18));
		}

		if (hp == 1)
		{
			hpSprite2.setTextureRect(sf::IntRect(0, 0, 20, 18));
		}



		sf::Event event;
		while (window.pollEvent(event))
		{
			if (event.type == sf::Event::Closed)
				window.close();
		}


		if (hp == 0)
		{
			//std::cout << "счет пока жив: " << sp / 100 << std::endl;
			//std::cout << "счет сбитых комет (+5): " << gg << std::endl;
			//std::cout << "счет : " << gg + sp / 100;
			checkGame = false;
			showMenu = true;
		}



		//движение фона
		spaceSprite1.move(-0.01 * time, 0);
		pos = spaceSprite1.getPosition();
		if (pos.x < -3840) {
			spaceSprite1.setPosition(3840, pos.y);
		}

		spaceSprite2.move(-0.01 * time, 0);
		pos = spaceSprite2.getPosition();
		if (pos.x < -3840) {
			spaceSprite2.setPosition(3840, pos.y);
		}

		if ((sf::Keyboard::isKeyPressed(sf::Keyboard::R))) { speedi -= 0.0002; }//увеличение скорости комет при нажатии на R


		rocket.update(time,pos);

		

////////////////////////////////ЗДЕСЬ НЕПОНЯТНО КАК СДЕЛАТЬ ТАК ЧТОБЫ НЕ БЫЛО В ФУНКЦИЯХ ЕЩЕ ФУНКЦИИ (КОРОЧЕ ВЛОЖЕННЫХ ФУНКЦИЙ БОЛЬШЕ 2)//////////////////////////////////////////////////
		if (checkGame == true) {
			window.clear();
			window.draw(spaceSprite1);
			window.draw(spaceSprite2);

			if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Space) || sf::Mouse::isButtonPressed(sf::Mouse::Right) ||
				sf::Mouse::isButtonPressed(sf::Mouse::Middle) || sf::Mouse::isButtonPressed(sf::Mouse::Left)) &&
				time1 > bulletInterval) //чтобы пулька вылетала через промежуток времени равную bulletInterval
			{
				pos = rocket.rocketSprite.getPosition();
				bullets.emplace_back(5, 5, pos.x + 100, pos.y + 50);
				bullets.emplace_back(5, 5, pos.x + 100, pos.y + 95);//создаем пульку 1 и 2
				clock1.restart(); //рестарт времени
				musics[0].sound.play();

			}

			// перемещение и отрисовка пуль


			//старая версия механики пуль и комет без удаления
			for (Meteor& meteor : meteors) {
				meteor.kometaSprite.move(-meteor.speed * 0.1 * time / 10 + (float)speedi, 0);
				for (auto bullet = bullets.begin(); bullet != bullets.end();) {
					bullet->bulletSprite.move(bullet->speed * 0.005 * time, 0);
					window.draw(bullet->bulletSprite);

					if (bullets.empty())break; //проверяем чтобы массив не был пуст если мы этого не сделаем у нас крашнется все после первого выстрела
					if (meteor.kometaSprite.getGlobalBounds().intersects(bullet->bulletSprite.getGlobalBounds())) {
						pos = meteor.kometaSprite.getPosition();
						meteor.kometaSprite.setPosition(3000, pos.y); // перемеситить комету назад
						bullet = bullets.erase(bullet); // удаление пули из вектора
						gg += 5;
						musics[1].sound.play();
					}
					else if (bullet->bulletSprite.getGlobalBounds().getPosition().x > 1940) {
						bullet = bullets.erase(bullet); // удаление пули из вектора
					}
					else
						bullet++;
				}

				window.draw(meteor.kometaSprite);
				pos = meteor.kometaSprite.getPosition();
				if (pos.x < -45) meteor.kometaSprite.setPosition(3000, pos.y);
			}




			for (Meteor& meteor : meteors) {
				meteor.kometaSprite.move(-meteor.speed * 0.1 * time / 10 + (float)speedi, 0);

				if (rocket.rocketHitbox1.getGlobalBounds().intersects(meteor.kometaSprite.getGlobalBounds()) ||
					rocket.rocketHitbox2.getGlobalBounds().intersects(meteor.kometaSprite.getGlobalBounds())) {
					hp -= 1;
					pos = meteor.kometaSprite.getPosition();
					meteor.kometaSprite.setPosition(3000, pos.y);
					musics[2].sound.play();
					if (hp == 0)
					{
						hpSprite1.setTextureRect(sf::IntRect(0, 0, 20, 18));
					}
				}

				window.draw(meteor.kometaSprite);
				pos = meteor.kometaSprite.getPosition();
				if (pos.x < -45) meteor.kometaSprite.setPosition(3000, pos.y);

			}


			window.draw(text); //счёт вывод
			window.draw(rocket.rocketSprite);//Вывод ракеты
			window.draw(hpSprite1);
			window.draw(hpSprite2);
			window.draw(hpSprite3);
			window.display();
		}
		else {

			checkGame = true;
			musics[3].sound.play();
			musics[4].sound.stop();
			if (showMenu) {
				menu2(window, (gg + sp), record);
				showMenu = false; // Устанавливаем флаг, чтобы больше не вызывать меню
			}
			goto repeat;
		}

	}
	return 0;
}


